#pragma once

#include <iostream>
#include <string>
#include <cstdio>
#include <ctime>
#include <sstream>
#include "./util.hpp"

namespace ns_log
{
    using namespace ns_util;

    enum{ // 日志等级
        INFO,
        DEBUG,
        WARNING,
        ERROR,
        FATAL
    };

    inline std::ostream& Log(const std::string& level, const std::string& file_name, int line)
    {
        std::string messsage = "[" + level + "] " + "[" + file_name + "] " + "(" + std::to_string(line) + ") "; // [级别] 文件名 (行号)
        messsage +=  ns_util::TimeUtil::GetTimeStamp(); // 获取时间戳
        std::cout << messsage;

        return std::cout;
    }

    #define LOG(level) Log(#level, __FILE__, __LINE__)
}

#define DBG_LEVEL 0
#define INF_LEVEL 1
#define ERR_LEVEL 2
#define DEFAULT_LEVEL DBG_LEVEL

// LogStream 类：支持流式输出
class LogStream {
public:
    // 构造函数接收文件路径、行号以及日志级别
    LogStream(const char* level_str, const char* file, int line)
        : level_str_(level_str), file_(file), line_(line) {}

    // 支持流式输出（operator<<）
    template <typename T>
    LogStream& operator<<(const T& value) {
        stream_ << value;
        return *this;
    }

    // 输出日志
    ~LogStream() {
        time_t t = time(nullptr);
        struct tm* ptm = localtime(&t);
        char time_str[32];
        strftime(time_str, sizeof(time_str), "%H:%M:%S", ptm);

        // 输出日志到控制台，去掉多余的 __FILE__ 和 __LINE__
        printf("[%s][%s][%s:%d]\t%s\n", level_str_, time_str, file_, line_, stream_.str().c_str());
    }

private:
    const char* level_str_;
    const char* file_;
    int line_;
    std::ostringstream stream_;  // 用于拼接输出内容
};

// 宏：用于创建 LogStream 对象并支持流式操作
#define LOG_STREAM(level_str) LogStream(level_str, __FILE__, __LINE__)

// 简化日志宏
#define LOG_DEBUG() LOG_STREAM("DEBUG")
#define LOG_INFO() LOG_STREAM("INFO")
#define LOG_ERROR() LOG_STREAM("ERROR")
#define LOG_WARN() LOG_STREAM("WARNING")
